//package java;

import java.sql.*;

/**
 * EXEMPLES CONNEXION ORACLE
 */

public class OracleJava
{
	private Connection conn = null;
	private Statement st = null;

	/**
	 * Constructeur de la class BDOracle Cr�e une connection au serveur
	 * 
	 * @throws java.lang.Exception : Lance une exception s'il y � eu une erreur
	 * 
	 * @param sid String : id system du serveur (disponible dans le tnsname)
	 * 
	 * @param port String : le port (disponible dans le tnsname)
	 * 
	 * @param url String : le ip ou url du serveur (disponible dans le tnsname)
	 * 
	 * @param pass String : mot de passe
	 * 
	 * @param user String : nom d'usager
	 * 
	 *            NB : l'url, port et sid se trouve dans le tnsname souvent
	 *            situ� dans C:\DevSuiteHome\network\admin\tnsnames.ora
	 */
	public OracleJava(String user, String pass, String url, String port,
			String sid) throws Exception
	{
		try
		{
			conn = null;
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@" + url + ":"
					+ port + ":" + sid, user, pass);
		}
		catch (ClassNotFoundException cnfe)
		{
			throw new Exception("Librairie de connexion oracle non trouv�");
		}

	}

	/**
	 * close() Ferme la connexion
	 */
	public void close() throws Exception
	{
		conn.close();
	}

	/**
	 * ResultSet executerRequete(String)throws SQLException
	 * 
	 * Ex�cute une requete de type SELECT et retourne son r�sultat sous forme de
	 * Resultset
	 * 
	 * NB : le ResultSet est li� a la connexion qui � �t� utilis�e pour ex�cuter
	 * la requete Le ResultSet doit donc �tre ferm� avant de pouvoir faire une
	 * autre requete
	 * 
	 * @throws java.sql.SQLException : Lance une exception s'il y � eu une
	 *             erreur
	 * 
	 * @return ResultSet : le r�sultat de la requete
	 * 
	 * @param requete : Le requete (SELECT)
	 */
	public ResultSet executerRequete(String requete) throws SQLException
	{
		st = conn.createStatement();
		ResultSet rs = st.executeQuery(requete);
		return rs;
	}

	/**
	 * int executerUpdate(String)
	 * 
	 * Execute un update (insert, update, create, drop ...) et retourne le
	 * nombre de ligne affect�es
	 * 
	 * @throws java.sql.SQLException : LAnce une exception s'il y a eu une
	 *             erreur
	 * 
	 * @return Retourne le nombre de ligne affect�es
	 * 
	 * @param requete : La requete de type update (insert, update, create, drop
	 *            ...)
	 */
	public int executerUpdate(String requete) throws SQLException
	{
		int retour = 0;
		st = conn.createStatement();
		retour = st.executeUpdate(requete);
		st.close();
		return retour;
	}

	/**
	 * int executer(String)
	 * 
	 * Execute n'importe quelle instruction SQL
	 * 
	 * @throws java.sql.SQLException : LAnce une exception s'il y a eu une
	 *             erreur
	 * 
	 * @return Retourne un boolean
	 * 
	 * @param requete :
	 */

	public boolean executer(String requete) throws SQLException
	{
		boolean retour;
		st = conn.createStatement();
		retour = st.execute(requete);
		st.close();
		return retour;
	}

	/**
	 * test et exemple d'utilisation
	 */
	public static void main(String[] args)
	{
		try
		{
			// l'url, port et sid se trouve dans le tnsname situ�
			// Souvent situ� dans C:\DevSuiteHome\network\admin\tnsnames.ora
			OracleJava bd = new OracleJava("jarras", "imedimed",
					"10.209.245.31", "1521", "bdlupin");

			String query = "drop table test";
			System.out.println("(drop table) NB ligne affect�s : "
					+ bd.executerUpdate(query));
			String query5 = "Create table test(noTest NUMBER(2), nomTest VARCHAR2(30))";
			int rs5 = bd.executerUpdate(query5);

			// Appeler une proc�dure
			String queryproc = "call Calcul_Budget(2)";
			boolean toto = bd.executer(queryproc);

			// Appeler une proc�dure � partir d'un package
			queryproc = "call PCK_EMPLOYE.augmentation(11340,15)";
			toto = bd.executer(queryproc);

			String query6 = "insert into test values (10,'salut')";
			int rs6 = bd.executerUpdate(query6);
			String query7 = "insert into test values (20,'toto')";
			int rs7 = bd.executerUpdate(query7);
			String querys = "SELECT * from test";
			ResultSet rss = bd.executerRequete(querys);

			while (rss.next())
			{
				System.out.println(rss.getInt("noTest") + " "
						+ rss.getString("NomTest"));
			}
			rss.close();

		}

		catch (Exception e)
		{
			e.printStackTrace();
		}

	}

}
